// 包controller处理HTTP请求与响应
package controller

import (
	"net/http"
	"strconv"

	"gitee.com/ysl729895/go-mall/internal/model"
	"gitee.com/ysl729895/go-mall/internal/service"
	"github.com/gin-gonic/gin"
)

// ProductController 处理商品相关HTTP请求
type ProductController struct {
	productService service.ProductService // 依赖Service接口
}

// NewProductController 构造函数（依赖注入service）
func NewProductController(productService service.ProductService) *ProductController {
	return &ProductController{productService: productService}
}

// CreateProduct 处理创建商品请求
// @Summary 创建新商品
// @Description 创建新的商品信息
// @Tags 商品管理
// @Accept json
// @Produce json
// @Param product body model.Product true "商品信息"
// @Success 201 {object} model.Product
// @Failure 400 {object} model.ErrorResponse
// @Failure 500 {object} model.ErrorResponse
// @Router /api/products [post]
func (c *ProductController) CreateProduct(ctx *gin.Context) {
	var product model.Product

	// 绑定JSON请求体到Product结构体
	if err := ctx.ShouldBindJSON(&product); err != nil {
		ctx.AbortWithStatusJSON(http.StatusBadRequest, model.ErrorResponse{
			Code:    http.StatusBadRequest,
			Message: "请求参数格式不正确",
			Error:   err.Error(),
		})
		return
	}

	// 调用Service层方法
	if err := c.productService.CreateProduct(&product); err != nil {
		ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.ErrorResponse{
			Code:    http.StatusInternalServerError,
			Message: "创建商品失败",
			Error:   err.Error(),
		})
		return
	}

	// 设置响应数据
	ctx.Set("responseData", product)
	ctx.Set("responseMessage", "创建商品成功")
	ctx.Status(http.StatusCreated)
}

// GetProduct 处理查询商品请求
// @Summary 获取商品信息
// @Description 根据商品ID查询商品详情
// @Tags 商品管理
// @Accept json
// @Produce json
// @Param id query int true "商品ID"
// @Success 200 {object} model.Product
// @Failure 400 {object} model.ErrorResponse
// @Failure 404 {object} model.ErrorResponse
// @Router /api/products [get]
func (c *ProductController) GetProduct(ctx *gin.Context) {
	// 从查询参数中获取ID并转换为uint
	idStr := ctx.Query("id")
	if idStr == "" {
		ctx.AbortWithStatusJSON(http.StatusBadRequest, model.ErrorResponse{
			Code:    http.StatusBadRequest,
			Message: "缺少商品ID参数",
			Error:   "商品ID是必填参数",
		})
		return
	}
	id, err := strconv.Atoi(idStr)
	if err != nil {
		ctx.AbortWithStatusJSON(http.StatusBadRequest, model.ErrorResponse{
			Code:    http.StatusBadRequest,
			Message: "无效的商品ID格式",
			Error:   err.Error(),
		})
		return
	}

	// 调用Service层方法
	product, err := c.productService.GetProduct(uint(id))
	if err != nil {
		ctx.AbortWithStatusJSON(http.StatusNotFound, model.ErrorResponse{
			Code:    http.StatusNotFound,
			Message: "商品未找到",
			Error:   "未找到指定ID的商品",
		})
		return
	}

	// 设置响应数据
	ctx.Set("responseData", product)
	ctx.Set("responseMessage", "获取商品信息成功")
}
